/**
 * By default DataTables only uses the sAjaxSource variable at initialisation
 * time, however it can be useful to re-read an Ajax source and have the table
 * update. Typically you would need to use the `fnClearTable()` and
 * `fnAddData()` functions, however this wraps it all up in a single function
 * call.
 * 
 * DataTables 1.10 provides the `dt-api ajax.url()` and `dt-api ajax.reload()`
 * methods, built-in, to give the same functionality as this plug-in. As such
 * this method is marked deprecated, but is available for use with legacy
 * version of DataTables. Please use the new API if you are used DataTables 1.10
 * or newer.
 * 
 * @name fnReloadAjax
 * @summary Reload the table's data from the Ajax source
 * @author [Allan Jardine](http://sprymedia.co.uk)
 * @deprecated
 * 
 * @param {string}
 *                [sNewSource] URL to get the data from. If not give, the
 *                previously used URL is used.
 * @param {function}
 *                [fnCallback] Callback that is executed when the table has
 *                redrawn with the new data
 * @param {boolean}
 *                [bStandingRedraw=false] Standing redraw (don't changing the
 *                paging)
 * 
 * @example var table = $('#example').dataTable();
 *  // Example call to load a new file table.fnReloadAjax(
 * 'media/examples_support/json_source2.txt' );
 *  // Example call to reload from original file table.fnReloadAjax();
 */

jQuery.fn.dataTableExt.oApi.fnReloadAjax = function(oSettings, sNewSource, fnCallback, bStandingRedraw) {
    // DataTables 1.10 compatibility - if 1.10 then `versionCheck` exists.
    // 1.10's API has ajax reloading built in, so we use those abilities
    // directly.
    if (jQuery.fn.dataTable.versionCheck) {
	var api = new jQuery.fn.dataTable.Api(oSettings);

	if (sNewSource) {
	    api.ajax.url(sNewSource).load(fnCallback, !bStandingRedraw);
	} else {
	    api.ajax.reload(fnCallback, !bStandingRedraw);
	}
	return;
    }

    if (sNewSource !== undefined && sNewSource !== null) {
	oSettings.sAjaxSource = sNewSource;
    }

    // Server-side processing should just call fnDraw
    if (oSettings.oFeatures.bServerSide) {
	this.fnDraw();
	return;
    }

    this.oApi._fnProcessingDisplay(oSettings, true);
    var that = this;
    var iStart = oSettings._iDisplayStart;
    var aData = [];

    this.oApi._fnServerParams(oSettings, aData);

    oSettings.fnServerData.call(oSettings.oInstance, oSettings.sAjaxSource, aData, function(json) {
	/* Clear the old information from the table */
	that.oApi._fnClearTable(oSettings);

	/* Got the data - add it to the table */
	var aData = (oSettings.sAjaxDataProp !== "") ? that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json;

	for ( var i = 0; i < aData.length; i++) {
	    that.oApi._fnAddData(oSettings, aData[i]);
	}

	oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();

	that.fnDraw();

	if (bStandingRedraw === true) {
	    oSettings._iDisplayStart = iStart;
	    that.oApi._fnCalculateEnd(oSettings);
	    that.fnDraw(false);
	}

	that.oApi._fnProcessingDisplay(oSettings, false);

	/* Callback user function - for event handlers etc */
	if (typeof fnCallback == 'function' && fnCallback !== null) {
	    fnCallback(oSettings);
	}
    }, oSettings);
};